package com.hsc.mvc.util;

import com.hsc.mvc.Configuration;
import com.hsc.mvc.conversion.ConversionStretagy;

/**
 * @author
 * @date 2025-06-03
 * @Description
 */
public class ConversionUtil {

    private static Configuration configuration;

    public static void setConfiguration(Configuration configuration) {
        ConversionUtil.configuration = configuration;
    }

    /**
     * 将具体的参数进行转换 比如 这么多类型：
     * MvcFile[]   --	MvcFile[]
     * --  MvcFile		(MvcFile[0])
     * String[]	--	String[]
     * -- 	String			(String[0])
     * -- 	int		Integer	(Integer.parseInt(String[0]))
     * --	double	Double	(Double.parseDouble(String[0]))
     * --  long	Long
     * --  int[]
     * --  double[]
     * --  long[]
     * --	Integer[]
     * -- 	Double[]
     * --  Date		(DateFormat(yyyy-MM-dd)(yyyy/MM/dd)) (自定义)
     *
     * @param source
     * @param targetType
     */
    public static Object convert(Object source, Class<?> targetType) throws Exception {
        //寻找对应的类型转换器。 如果找不到， 就原封不动的返回source
        // 找的时候，需要使用source的类型 + targetType类型 ，形成一个key
        //这里有一个小问题需要注意一下：
        //  应用中 int 和 Integer 是相同的。  自动拆装箱。
        //  有一个类型转换器，是将String[]-Integer. 转成Integer之后，这个值，尽可以赋值给int，也可以赋值给Integer
        //  问题是，如果这个参数类型是int，最终组成的key String[]-int
        //  如果一个转换器的key是String[],int,其泛型就应该是<String[],int>
        //  但int这种基本类型不能作为泛型
        //  所以我们需要做一个处理，将int基本类型变成包装类处理key
        // 获取key 约定：l->为传递的参数类型 r->为转换后的参数类型
        String l = source.getClass().getTypeName();
        String r = getRightName(targetType);
        // 根据key找具体策略类
        String key = l + "-" + r;
        ConversionStretagy conversionStretagy = configuration.getConvertor(key);
        // 获取到具体策略类不为null
        if (conversionStretagy != null) {
            // 执行具体的方法
            source = conversionStretagy.covert(source);
        }
        return source;

    }

    private static String getRightName(Class<?> targetType) {
        // 将基本数据类型转为包装类
        if (targetType == int.class) {
            return Integer.class.getTypeName();
        } else if (targetType == byte.class) {
            return Byte.class.getTypeName();
        } else if (targetType == long.class) {
            return Long.class.getTypeName();
        } else if (targetType == short.class) {
            return Short.class.getTypeName();
        } else if (targetType == float.class) {
            return Float.class.getTypeName();
        } else if (targetType == double.class) {
            return Double.class.getTypeName();
        } else if (targetType == boolean.class) {
            return Boolean.class.getTypeName();
        } else {
            // 不是基本数据类型
            return targetType.getTypeName();
        }
    }
}
